package proxy_pattern.dynamic.forum;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 论坛功能代理类，实现动态代理
 * @author 申书航
 * @version 1.0
 */
public class ForumFunctionProxy implements InvocationHandler {
    private final UserDAO ud;
    private final ForumFunction target;

    /**
     * 构造方法，初始化目标对象和用户数据访问对象
     * @param target  目标对象
     */
    private ForumFunctionProxy(ForumFunction target) {
        this.target = target;
        ud = new UserDAO();
    }

    /**
     * 获取代理实例
     * @param target  目标对象
     * @return 返回 VisitFunction 接口的代理对象
     */
    public static VisitFunction getProxy(ForumFunction target) {
        ForumFunctionProxy forumFunctionProxy = new ForumFunctionProxy(target);
        return (VisitFunction) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), forumFunctionProxy);
    }

    /**
     * 代理方法实现，控制访问权限
     * @param proxy  代理类
     * @param method 被调用的方法
     * @param args   方法参数
     * @return 方法执行结果
     * @throws Throwable 可能抛出的异常
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (!"register".equals(method.getName()) && !"viewPost".equals(method.getName())) {
            //判断是否有权限
            User u = (User) args[0];
            if (ud.queryUser(u.getUsername()) == null) {
                System.out.println("你没有访问权限");
                return null;
            }
        }
        return method.invoke(target, args);
    }
}

